package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.health.dao.OrderSettingDao;
import com.itheima.health.pojo.OrderSetting;
import com.itheima.health.service.OrderSettingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * @Author likepei
 * @Date 2020/4/2 23:05
 * @Version v1.0
 * @Description 预约设置业务接口实现类
 */
@Service
@Slf4j
@Transactional
public class OrderSettingServiceImpl implements OrderSettingService {

    //依赖注入
    @Autowired
    private OrderSettingDao orderSettingDao;

    /**
     * 添加预约内容
     * @param rowsList 预约设置列表
     */
    @Override
    public void add(List<String[]> rowsList) {
        //判断数据是否为空,为空抛出异常
        if (rowsList == null){
            throw new RuntimeException("预约设置列表 不能为空");
        }

        //遍历列表，逐个判断保存
        for (String[] row : rowsList) {
            //检查此数据(日期)是否存在
            Long count = orderSettingDao.countByOrderDate( new Date(row[0]) );

            //封装预约设置的pojo对象
            OrderSetting orderSetting = new OrderSetting(new Date(row[0]), Integer.parseInt(row[1]));

            if(count >0){
                //如果预约日期存在，执行更新操作
                orderSettingDao.updateNumber(orderSetting);
            } else {
                //如果预约日期不存在，执行保存操作
                orderSettingDao.add(orderSetting);
            }
        }
    }

    /**
     * 日历展示预约设置信息
     * @param date 前端传递过来的日期 2020-4
     * @return
     */
    @Override
    public List<Map<String, Integer>> getOrderSettingByMonth(String date) {
        //指定当前月查询的日期范围
        Map<String, String> map = new HashMap<>();
        //起始日期及结束日期
        String dateBegin = date + "-1"; //2020-4-1
        String dateEnd = date + "-31"; //2020-4-31
        //把起始日期及结束日期 存入map
        map.put("dateBegin", dateBegin);
        map.put("dateEnd", dateEnd);

        //调用dao, 获取当前月的预约设置的数据  List<OrderSetting>
        List<OrderSetting> orderSettingList = orderSettingDao.getOrderSettingByMonth(map);

        //把List<OrderSetting> 数据 存到 前端需要的格式的集合中 (日期哪一天, 可预约人数, 已预约人数)
        //定义一个集合 List<Map<String, Integer>>, 用于存放前端需要的返回数据(日期哪一天, 可预约人数, 已预约人数)
        List<Map<String, Integer>> list = new ArrayList<>();
        //查询到的 预约设置的集合
        for (OrderSetting orderSetting : orderSettingList) {
            //定义一个Map<String, Integer>, 存当前预约设置的信息
            Map<String, Integer> orderSettingMap = new HashMap<>();
            //日期哪一天
            orderSettingMap.put("date", orderSetting.getOrderDate().getDate());
            //可预约人数
            orderSettingMap.put("number", orderSetting.getNumber());
            //已预约人数
            orderSettingMap.put("reservations", orderSetting.getReservations());
            //把每次循环中的Map数据, 保存到 用于返回给前端的集合 list
            list.add(orderSettingMap);
        }
        //返回 存放前端需要的数据
        return list;
    }

    /**
     * 基于日期 设置OrderSetting对象
     * @param orderSetting
     */
    @Override
    public void editNumberByDate(OrderSetting orderSetting) {
        //检查当前日期在数据库中 是否存在数据
        Long count = orderSettingDao.countByOrderDate(orderSetting.getOrderDate());

        if(count >0){
            //存在, 更新预约设置记录
            orderSettingDao.updateNumber(orderSetting);
        } else {
            //不存在, 新增预约设置记录
            orderSettingDao.add(orderSetting);
        }
    }

    @Override
    public void deleteorderSetting(Date date) {
        System.out.println("处理垃圾数据开始");
        List<Date> datelist = orderSettingDao.selectAlldate();
        for (Date orderDate : datelist) {
            int num = date.compareTo(orderDate);
            int i = date.compareTo(orderDate);
            System.out.println("输出数据" + i);
            // 判断
            if (num >= 0) {
                // 大于0 说明orderDate这个日期已经过期 现在的时间已经超过了orderDate,所以是垃圾数据 删除
                // 调用Dao
                orderSettingDao.deleteData(orderDate);
            }
        }
    }

}
